package urjc.as.emergencies.resources.ambulance;

import org.restlet.Context;
import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Request;
import org.restlet.data.Response;
import org.restlet.data.Status;
import org.restlet.resource.ResourceException;
import org.restlet.resource.Variant;

import urjc.as.emergencies.data.Ambulance;
import urjc.as.emergencies.data.Storage;
import urjc.as.emergencies.resources.BaseResource;

public class AmbulanceResource extends BaseResource {

	public AmbulanceResource(Context context, Request request, Response response) {
		super(context, request, response);
		getVariants().add(new Variant(MediaType.TEXT_XML));

	}

	public boolean allowPatch() {
		return true;
	}
	
	@Override
	public boolean allowDelete() {
		return true;
	}

	/**
	 * Gestiona las peticiones de actualización parcial de campos de la
	 * Ambulancia
	 */
	public void handlePatch() {
		// Obtiene el recurso ambulancia
		Storage storage = Storage.getInstance();
		Ambulance ambulance = (Ambulance) storage.getEntity(getRequest()
				.getResourceRef().toString());

		// Obtiene el formulario en el que vienen los cambios a aplicar
		Form form = (Form) getRequest().getEntityAsForm();
		String estado = (String) form.getValues("estado");
		try {
			if (estado != null) {
				boolean ok = asignaEstadoAmbulancia(ambulance, estado);
				if(!ok){
					getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
					return;
				}
			}
			
			String id = (String) form.getValues("id");
			if (id != null) {
				ambulance.setId(Integer.parseInt(id));
			}

			String missionId = (String) form.getValues("misionId");
			if (missionId != null) {
				int nuevaMis = Integer.parseInt(missionId);
				// Si mision = -1 entonces ambulancia = recargando
				if (nuevaMis == -1) {
					ambulance.setStatus(Ambulance.RECARGANDO);
					ambulance.setMisionId(nuevaMis);
				} else {
					// Si no esta ocupada, se asigna nueva mision
					if (ambulance.getStatus() != Ambulance.ATENDIENDO) {
						// Se asigna mision y estado = atendiendo
						ambulance.setStatus(Ambulance.ATENDIENDO);
						ambulance.setMisionId(nuevaMis);
					} else {
						// Notificar de que esta ocupada
						getResponse().setStatus(
								Status.CLIENT_ERROR_NOT_ACCEPTABLE,
								"La ambulancia esta ocupada");
						return;
					}
				}
			}
		} catch (Exception e) {
			getResponse().setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
			return;
		}
		getResponse().setStatus(Status.SUCCESS_OK);

	}
	
	@Override
	public void removeRepresentations() throws ResourceException {
		
		Ambulance ambulance = (Ambulance) getStorage().getEntity(getRequest().getResourceRef()
			    .getBaseRef()
			    .toString());
		
		if(ambulance.getStatus() == Ambulance.LIBRE){	
			
			getStorage().delEntity(ambulance.getUri());
			getResponse().setStatus(new Status(Status.SUCCESS_OK, "Resource deleted"));		
		}else{
			getResponse().setStatus(new Status(Status.CLIENT_ERROR_FORBIDDEN, "Las ambulancias no libres no pueden ser borradas"));
		}
			
	}
	
	
	private boolean asignaEstadoAmbulancia(Ambulance ambulance, String estado){
		
		if(estado.compareTo("Libre") == 0){
			ambulance.setStatus(Ambulance.LIBRE);
			return true;
		}
		
		if(estado.compareTo("Atendiendo")== 0){
			ambulance.setStatus(Ambulance.ATENDIENDO);
			return true;
		}
		
		if(estado.compareTo("Descansando") == 0){
			ambulance.setStatus(Ambulance.DESCANSANDO);
			return true;
		}
		
		if(estado.compareTo("Recargando")==0){
			ambulance.setStatus(Ambulance.RECARGANDO);
			return true;
		}
		
		return false;
	}




}
